package com.cencat.order.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cencat.order.entity.Merchant;
import com.cencat.order.vo.MerchantVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;

/**
 * 固定商家数据访问层接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
@Mapper
public interface MerchantMapper extends BaseMapper<Merchant> {

    /**
     * 分页查询商家列表
     *
     * @param page 分页参数
     * @param merchantName 商家名称(模糊查询)
     * @param merchantCode 商家编号(模糊查询)
     * @param merchantType 商家类型
     * @param merchantStatus 商家状态
     * @param businessLicense 营业执照号(模糊查询)
     * @param contactPhone 联系电话(模糊查询)
     * @param province 省份
     * @param city 城市
     * @param district 区县
     * @param startTime 创建开始时间
     * @param endTime 创建结束时间
     * @return 商家分页列表
     */
    IPage<MerchantVO> selectMerchantPage(Page<MerchantVO> page,
                                       @Param("merchantName") String merchantName,
                                       @Param("merchantCode") String merchantCode,
                                       @Param("merchantType") String merchantType,
                                       @Param("merchantStatus") Integer merchantStatus,
                                       @Param("businessLicense") String businessLicense,
                                       @Param("contactPhone") String contactPhone,
                                       @Param("province") String province,
                                       @Param("city") String city,
                                       @Param("district") String district,
                                       @Param("startTime") LocalDateTime startTime,
                                       @Param("endTime") LocalDateTime endTime);

    /**
     * 根据商家编号查询商家信息
     *
     * @param merchantCode 商家编号
     * @return 商家信息
     */
    MerchantVO selectByMerchantCode(@Param("merchantCode") String merchantCode);

    /**
     * 根据营业执照号查询商家信息
     *
     * @param businessLicense 营业执照号
     * @return 商家信息
     */
    Merchant selectByBusinessLicense(@Param("businessLicense") String businessLicense);

    /**
     * 根据联系电话查询商家信息
     *
     * @param contactPhone 联系电话
     * @return 商家信息
     */
    Merchant selectByContactPhone(@Param("contactPhone") String contactPhone);

    /**
     * 查询指定范围内的商家
     *
     * @param longitude 经度
     * @param latitude 纬度
     * @param radius 搜索半径(公里)
     * @param merchantType 商家类型
     * @param merchantStatus 商家状态
     * @return 商家列表
     */
    List<MerchantVO> selectMerchantsInRange(@Param("longitude") BigDecimal longitude,
                                          @Param("latitude") BigDecimal latitude,
                                          @Param("radius") BigDecimal radius,
                                          @Param("merchantType") String merchantType,
                                          @Param("merchantStatus") Integer merchantStatus);

    /**
     * 查询商家统计信息
     *
     * @param merchantId 商家ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 统计信息
     */
    Map<String, Object> selectMerchantStatistics(@Param("merchantId") Long merchantId,
                                                @Param("startTime") LocalDateTime startTime,
                                                @Param("endTime") LocalDateTime endTime);

    /**
     * 更新商家状态
     *
     * @param merchantId 商家ID
     * @param merchantStatus 商家状态
     * @param updateTime 更新时间
     * @param remark 备注
     * @return 更新行数
     */
    int updateMerchantStatus(@Param("merchantId") Long merchantId,
                            @Param("merchantStatus") Integer merchantStatus,
                            @Param("updateTime") LocalDateTime updateTime,
                            @Param("remark") String remark);

    /**
     * 更新商家认证状态
     *
     * @param merchantId 商家ID
     * @param certificationStatus 认证状态
     * @param certificationTime 认证时间
     * @param certificationRemark 认证备注
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateCertificationStatus(@Param("merchantId") Long merchantId,
                                 @Param("certificationStatus") Integer certificationStatus,
                                 @Param("certificationTime") LocalDateTime certificationTime,
                                 @Param("certificationRemark") String certificationRemark,
                                 @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新商家营业时间
     *
     * @param merchantId 商家ID
     * @param businessStartTime 营业开始时间
     * @param businessEndTime 营业结束时间
     * @param businessDays 营业日期
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateBusinessHours(@Param("merchantId") Long merchantId,
                           @Param("businessStartTime") LocalTime businessStartTime,
                           @Param("businessEndTime") LocalTime businessEndTime,
                           @Param("businessDays") String businessDays,
                           @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新商家联系信息
     *
     * @param merchantId 商家ID
     * @param contactName 联系人姓名
     * @param contactPhone 联系电话
     * @param contactEmail 联系邮箱
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateContactInfo(@Param("merchantId") Long merchantId,
                         @Param("contactName") String contactName,
                         @Param("contactPhone") String contactPhone,
                         @Param("contactEmail") String contactEmail,
                         @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新商家地址信息
     *
     * @param merchantId 商家ID
     * @param province 省份
     * @param city 城市
     * @param district 区县
     * @param address 详细地址
     * @param longitude 经度
     * @param latitude 纬度
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateAddressInfo(@Param("merchantId") Long merchantId,
                         @Param("province") String province,
                         @Param("city") String city,
                         @Param("district") String district,
                         @Param("address") String address,
                         @Param("longitude") BigDecimal longitude,
                         @Param("latitude") BigDecimal latitude,
                         @Param("updateTime") LocalDateTime updateTime);

    /**
     * 更新商家配送设置
     *
     * @param merchantId 商家ID
     * @param deliveryRadius 配送半径
     * @param minOrderAmount 最小起送金额
     * @param deliveryFee 配送费
     * @param freeDeliveryAmount 免配送费金额
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int updateDeliverySettings(@Param("merchantId") Long merchantId,
                              @Param("deliveryRadius") BigDecimal deliveryRadius,
                              @Param("minOrderAmount") BigDecimal minOrderAmount,
                              @Param("deliveryFee") BigDecimal deliveryFee,
                              @Param("freeDeliveryAmount") BigDecimal freeDeliveryAmount,
                              @Param("updateTime") LocalDateTime updateTime);

    /**
     * 批量更新商家状态
     *
     * @param merchantIds 商家ID列表
     * @param merchantStatus 商家状态
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int batchUpdateMerchantStatus(@Param("merchantIds") List<Long> merchantIds,
                                 @Param("merchantStatus") Integer merchantStatus,
                                 @Param("updateTime") LocalDateTime updateTime);

    /**
     * 查询商家订单统计
     *
     * @param merchantId 商家ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 订单统计信息
     */
    Map<String, Object> selectMerchantOrderStatistics(@Param("merchantId") Long merchantId,
                                                     @Param("startTime") LocalDateTime startTime,
                                                     @Param("endTime") LocalDateTime endTime);

    /**
     * 查询商家收入统计
     *
     * @param merchantId 商家ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 收入统计信息
     */
    Map<String, Object> selectMerchantIncomeStatistics(@Param("merchantId") Long merchantId,
                                                      @Param("startTime") LocalDateTime startTime,
                                                      @Param("endTime") LocalDateTime endTime);

    /**
     * 查询商家配送统计
     *
     * @param merchantId 商家ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 配送统计信息
     */
    Map<String, Object> selectMerchantDeliveryStatistics(@Param("merchantId") Long merchantId,
                                                        @Param("startTime") LocalDateTime startTime,
                                                        @Param("endTime") LocalDateTime endTime);

    /**
     * 查询商家评价统计
     *
     * @param merchantId 商家ID
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 评价统计信息
     */
    Map<String, Object> selectMerchantRatingStatistics(@Param("merchantId") Long merchantId,
                                                      @Param("startTime") LocalDateTime startTime,
                                                      @Param("endTime") LocalDateTime endTime);

    /**
     * 查询热门商家排行榜
     *
     * @param limit 查询数量限制
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @param merchantType 商家类型
     * @param city 城市
     * @return 商家排行榜
     */
    List<Map<String, Object>> selectTopMerchants(@Param("limit") Integer limit,
                                                @Param("startTime") LocalDateTime startTime,
                                                @Param("endTime") LocalDateTime endTime,
                                                @Param("merchantType") String merchantType,
                                                @Param("city") String city);

    /**
     * 查询商家分布统计
     *
     * @param merchantType 商家类型
     * @return 商家分布统计信息
     */
    List<Map<String, Object>> selectMerchantDistributionStatistics(@Param("merchantType") String merchantType);

    /**
     * 查询商家类型分布统计
     *
     * @return 商家类型分布统计信息
     */
    List<Map<String, Object>> selectMerchantTypeDistributionStatistics();

    /**
     * 查询商家规模分布统计
     *
     * @return 商家规模分布统计信息
     */
    List<Map<String, Object>> selectMerchantScaleDistributionStatistics();

    /**
     * 查询商家活跃度统计
     *
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 活跃度统计信息
     */
    List<Map<String, Object>> selectMerchantActivityStatistics(@Param("startTime") LocalDateTime startTime,
                                                              @Param("endTime") LocalDateTime endTime);

    /**
     * 查询商家合作时长统计
     *
     * @param merchantId 商家ID
     * @return 合作时长统计信息
     */
    Map<String, Object> selectMerchantCooperationDurationStatistics(@Param("merchantId") Long merchantId);

    /**
     * 查询商家服务质量评估
     *
     * @param merchantId 商家ID
     * @param startTime 评估开始时间
     * @param endTime 评估结束时间
     * @return 服务质量评估信息
     */
    Map<String, Object> selectMerchantServiceQualityAssessment(@Param("merchantId") Long merchantId,
                                                              @Param("startTime") LocalDateTime startTime,
                                                              @Param("endTime") LocalDateTime endTime);

    /**
     * 查询商家配送覆盖范围
     *
     * @param merchantId 商家ID
     * @return 配送覆盖范围信息
     */
    Map<String, Object> selectMerchantDeliveryCoverage(@Param("merchantId") Long merchantId);

    /**
     * 查询商家营业状态
     *
     * @param merchantId 商家ID
     * @param currentTime 当前时间
     * @return 营业状态信息
     */
    Map<String, Object> selectMerchantBusinessStatus(@Param("merchantId") Long merchantId,
                                                    @Param("currentTime") LocalDateTime currentTime);

    /**
     * 查询商家优惠活动
     *
     * @param merchantId 商家ID
     * @param currentTime 当前时间
     * @return 优惠活动列表
     */
    List<Map<String, Object>> selectMerchantPromotions(@Param("merchantId") Long merchantId,
                                                      @Param("currentTime") LocalDateTime currentTime);

    /**
     * 查询商家配送能力评估
     *
     * @param merchantId 商家ID
     * @param startTime 评估开始时间
     * @param endTime 评估结束时间
     * @return 配送能力评估信息
     */
    Map<String, Object> selectMerchantDeliveryCapacityAssessment(@Param("merchantId") Long merchantId,
                                                                @Param("startTime") LocalDateTime startTime,
                                                                @Param("endTime") LocalDateTime endTime);

    /**
     * 查询商家风险评估
     *
     * @param merchantId 商家ID
     * @return 风险评估信息
     */
    Map<String, Object> selectMerchantRiskAssessment(@Param("merchantId") Long merchantId);

    /**
     * 软删除商家信息
     *
     * @param merchantId 商家ID
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int softDeleteMerchant(@Param("merchantId") Long merchantId,
                          @Param("updateTime") LocalDateTime updateTime);

    /**
     * 批量软删除商家信息
     *
     * @param merchantIds 商家ID列表
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int batchSoftDeleteMerchants(@Param("merchantIds") List<Long> merchantIds,
                                @Param("updateTime") LocalDateTime updateTime);

    /**
     * 恢复已删除的商家信息
     *
     * @param merchantId 商家ID
     * @param updateTime 更新时间
     * @return 更新行数
     */
    int restoreMerchant(@Param("merchantId") Long merchantId,
                       @Param("updateTime") LocalDateTime updateTime);

    /**
     * 查询商家操作日志
     *
     * @param merchantId 商家ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param limit 查询数量限制
     * @return 操作日志列表
     */
    List<Map<String, Object>> selectMerchantOperationLogs(@Param("merchantId") Long merchantId,
                                                         @Param("startTime") LocalDateTime startTime,
                                                         @Param("endTime") LocalDateTime endTime,
                                                         @Param("limit") Integer limit);
}